package jp.co.systemi.asp.workflow.group;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.logging.Logger;

import jp.co.systemi.asp.workflow.Main;
import jp.co.systemi.asp.workflow.data.Group;
import jp.co.systemi.asp.workflow.data.GroupMeta;
import jp.co.systemi.asp.workflow.data.User;
import jp.co.systemi.asp.workflow.data.UserGroup;
import jp.co.systemi.asp.workflow.data.UserGroupMeta;
import jp.co.systemi.asp.workflow.data.UserMeta;
import jp.co.systemi.asp.workflow.peer.GroupPeer;
import jp.co.systemi.asp.workflow.peer.UserPeer;
import jp.co.systemi.asp.workflow.user.UserRef;

import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.PropertyModel;
import org.slim3.datastore.Datastore;

/**
 * グループ照会 Mainから継承すること
 *
 * @author wzhang
 *
 */
public class GroupRef extends Main {
    /**
     * ログ出力 クラス名をあわせること
     */
    @SuppressWarnings("unused")
    private static final Logger log = Logger
            .getLogger(GroupRef.class.getName());
    /**
     * 画面データを保持するモデル できるだけ、データオブジェクトで代用すること 代用できない場合は、本ファイルにstatic モデルクラスを定義すること
     * 画面間のモデルの共通化より、モジュール分割、カプセルを重視する
     */
    private Group model = null;
    /*
     * 以下入力項目を定義する
     */
    /**
     * 入力項目のValidatorをAnnotationで定義する 画面項目定義書からそのまま転記するイメージ
     */
    // ポジションはLisｔViewを利用する
    String code = "";

    /**
     * コンストラクター 画面の生成、イベント処理の定義はすべて、この中で完結する
     */
    public GroupRef(PageParameters parameters) {
        code = parameters.getString("code");
        GroupMeta gm = GroupMeta.get();
        model = Datastore.query(gm).filter(gm.code.equal(code)).asSingle();
        Group parentGroup = Datastore.query(gm).filter(gm.code.equal(model.getParentGroup())).asSingle();
        if(parentGroup != null){
            model.setParentGroupName(parentGroup.getName());
        }
        // Formを生成する
        Form<Group> form = new MainForm<Group>(this, "wi_groupRefForm") {

            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmitInner() {
                PageParameters pars = new PageParameters();
                pars.add("code", model.getCode());
                setResponsePage(GroupReg.class, pars);
            }
        };
        form.add(new Label("wi_groupCode", new PropertyModel<String>(model,
                "code")));
        form.add(new Label("wi_groupName", model.getName()));
        form.add(new Label("wi_groupSeq", model.getSeq().toString()));
        form.add(new Label("wi_groupNotes", model.getNotes()));

        // form.add(new Label("wi_parentGroup", model.getParentGroupName()));
        PageParameters pars = new PageParameters();
        pars.add("code", model.getParentGroup());
        BookmarkablePageLink<GroupRef> link = new BookmarkablePageLink<GroupRef>(
                "wi_parentGroupLink", GroupRef.class, pars);
        form.add(link);
        link.add(new Label("wi_parentGroup", model.getParentGroupName()));

        // 　下位組織
        Group parent = new Group();
        parent.setParentGroup(model.getCode());
        List<Group> hasGroups = GroupPeer.doSearch(parent);
        form.add(new ListView<Group>("wi_trHas", hasGroups) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<Group> item) {
                Group group = (Group) item.getModelObject();
                PageParameters pars = new PageParameters();
                pars.add("code", group.getCode());
                BookmarkablePageLink<GroupRef> link = new BookmarkablePageLink<GroupRef>(
                        "wi_tdChildGroupLink", GroupRef.class, pars);
                item.add(link);
                link.add(new Label("wi_tdChildGroup", group.getName()));
            }

        });
        SimpleDateFormat sdf = new SimpleDateFormat(getString("date.format.yyyyMM"));
        if (model.getStartDate() != null) {
            form
                    .add(new Label("wi_startDate", sdf.format(model
                            .getStartDate())));
        } else {
            form.add(new Label("wi_startDate", ""));
        }
        WebMarkupContainer trDissolve = new WebMarkupContainer("wi_trDissolve");
        form.add(trDissolve);
        if (model.getDissolveDate() != null) {
            trDissolve.add(new Label("wi_dissolveDate", sdf.format(model
                    .getDissolveDate())));
        } else {
            trDissolve.add(new Label("wi_dissolveDate", ""));
            trDissolve.setVisible(false);
        }
        // ユーザーグループからポジションリストを抽出
        UserGroupMeta ugm = UserGroupMeta.get();
        List<UserGroup> positions = Datastore.query(ugm).filter(ugm.groupCode.equal(model.getCode())).sort(ugm.roleSeq.asc).asList();
        form.add(new ListView<UserGroup>("wi_trPosition", positions) {
            private static final long serialVersionUID = -5133207331952149100L;

            @Override
            protected void populateItem(ListItem<UserGroup> item) {
                UserGroup userGroup = (UserGroup) item.getModelObject();
                item.add(new Label("wi_tdPosition", new PropertyModel<String>(
                        userGroup, "role")));
                PageParameters pars = new PageParameters();
                pars.add("loginId", userGroup.getLoginId());
                BookmarkablePageLink<UserRef> link = new BookmarkablePageLink<UserRef>(
                        "wi_tdOwnerLink", UserRef.class, pars);
                UserMeta um = UserMeta.get();

                User user = Datastore.query(um).filter(um.loginId.equal(userGroup.getLoginId())).asSingle();
                if (user != null) {
                    link.add(new Label("wi_tdOwner", UserPeer.getName(user)));
                } else {
                    link.add(new Label("wi_tdOwner", ""));
                }
                item.add(link);
            }
        });
    }
}
